#include<iostream>
#include<pthread.h>
#include<assert.h>
#include<queue>
#include<stdlib.h>
#include<ctime>
#include<sys/types.h>
#include<unistd.h>
#include"blockqueue.hpp"
using namespace std;



void* producter(void* args)
{
    blockqueue<int> * _pbq=static_cast<blockqueue<int>*>(args);
    int num=0;
    while(true)
    {
    num=rand()%200+1;//设置随机数据
    _pbq->push(num);//生产者放入数据
    cout<<"producter push num: "<<num<<" in bq"<<endl;
   // sleep(1);
    }
    return nullptr;
}

void* consumer(void* args)
{
    blockqueue<int> * _cbq=static_cast<blockqueue<int>*>(args);
   int ret=0;
    while(true)
    {
        _cbq->pop(&ret);//消费者取出数据
        cout<<"consumer take num: "<<ret<<" from bq"<<endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
 srand((unsigned long)time(nullptr)^getpid());
 blockqueue<int>* _bq= new blockqueue<int>();
pthread_t p,c;//
 int n=pthread_create(&p,nullptr,producter,(void*)_bq);//生产者线程
 assert(n==0); 
 int m=pthread_create(&p,nullptr,consumer,(void*)_bq);//消费者线程
 assert(m==0);


 pthread_join(p,nullptr);//回收生产者线程
 pthread_join(c,nullptr);//回收消费者线程
    return 0;
}



// int mymath(int x,int y,char op)
// {
//     int ret=0;
//     switch(op)
//     {
//         case '+':
//        ret=x+y;
//         break;

//         case '-':
//         ret=x-y;
//         break;  

//         case '*':
//         ret=x*y;
//         break;        
        
//         case '/':
//         if(y==0)
//         {
//             cerr<<"div zero erro!"<<endl;
//             ret=-1;
//         }else
//         {
//             ret=x/y;
//         }
//         break;        
        
//         case '%':
//         if(y==0)
//         {
//             cerr<<"div zero erro!"<<endl;
//             ret=-1;
//         }else
//         {
//             ret=x%y;
//         }
//         break;

//         default:
//         //do nothing
//         break;
//     }
//     return ret;
// }